﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace MedicalCare.Common
{
    public class upload
    {
        #region 变量

        System.Web.HttpPostedFile postedFile;

        protected string localFileName;//原文件名(含扩展名)
        protected string localFileExtension;//原扩展名
        protected long localFileLength;//原文件大小
        protected string localFilePath;//原文件路径

        protected string saveFileName;//保存的文件名(含扩展名)
        protected string saveFileExtension;//保存的扩展名
        //protected long saveFileLength;//保存的文件大小
        protected string saveFilePath;//保存文件的服务器端的完整路径
        protected string saveFileFolderPath;//保存文件的服务器端的文件夹路径
       

        private string path = null;
        private string fileType = null;
        private int sizes = 0;

        public string saveFileErrorMessage=string.Empty;//保存文件的错误提示

        #endregion

        #region upload():初始化变量
        /// <summary>
        /// 初始化变量
        /// </summary>
        public upload()
        {
            path = @"UploadFile"; //上传路径
            fileType = "jpg|gif|bmp|jpeg|png|doc|wma";
            sizes = 200; //传文件的大小,默认200KB
        }
        #endregion

        #region 设置传入的值:Path/Sizes/FileType
        /// <summary>
        /// 设置上传路径,如:uploadimages
        /// </summary>
        public string Path
        {
            set
            {
                path = @"" + value + @"";
            }
        }

        /// <summary>
        /// 设置上传文件大小,单位为KB
        /// </summary>
        public int Sizes
        {
            set
            {
                sizes = value;
            }
        }

        /// <summary>
        /// 设置上传文件的类型,如:jpg|gif|bmp
        /// </summary>
        public string FileType
        {
            set
            {
                fileType = value;
            }
        }
        #endregion

        #region SaveAs()上传文件

        public string SaveAs(System.Web.HttpFileCollection files)
        {
            string myReturn = "";
            try
            {
                for (int iFile = 0; iFile < files.Count; iFile++)
                {
                    postedFile = files[iFile];
                    //获得文件的上传的路径
                    SaveAs(postedFile);
                }
            }
            catch
            {
                //异常
                message("出现未知错误！");
                myReturn = null;
            }
            return myReturn;
        }

        public string SaveAs(System.Web.HttpPostedFile files)
        {
            string myReturn = "";
            try
            {
                postedFile = files;
                //获得文件的上传的路径
                localFilePath = postedFile.FileName;
                //判断上传文件路径是否为空
                if (localFilePath == null || localFilePath == "")
                {
                    //message("您没有上传数据呀，是不是搞错了呀!");
                    saveFileErrorMessage = "您还没有选择上传文件!";
                    return myReturn;
                }
                else
                {
                    #region 判断文件大小
                    //获得上传文件的大小
                    localFileLength = postedFile.ContentLength;
                    //判断上传文件大小
                    if (localFileLength >= sizes * 1024)
                    {
                        //message("上传的图片不能大于" + sizes + "KB");
                        saveFileErrorMessage = "上传的文件不能大于" + sizes + "KB";
                        return myReturn;
                    }
                    #endregion

                    #region 文件夹
                    //获取保存文件夹路径
                    saveFileFolderPath = getSaveFileFolderPath(path);
                    #endregion

                    #region 文件名
                    //获得原文件名（含扩展名）
                    localFileName = System.IO.Path.GetFileName(postedFile.FileName);

                    saveFileName = DateTime.UtcNow.ToString("yyyy" + "MM" + "dd" + "HH" + "mm" + "ss" + "ffffff");//"yyyy"+"MM"+"dd"+"HH"+"mm"+"ss"+"ffffff"
                    #endregion

                    #region 扩展名
                    //获取原文件扩展名
                    localFileExtension = getFileExtension(localFileName);

                    //如果为真允许上传,为假则不允许上传
                    if (localFileExtension == "")
                    {
                        //message("目前本系统支持的格式为:" + fileType);
                        saveFileErrorMessage = "目前本系统支持的格式为:" + fileType;
                        return myReturn;
                    }
                    //得到保存文件的扩展名,可根据需要更改扩展名
                    saveFileExtension = localFileExtension;
                    #endregion

                    //得到保存文件的完整路径
                    saveFilePath = saveFileFolderPath + "\\" + saveFileName + saveFileExtension;
                    postedFile.SaveAs(saveFilePath);
                    //myReturn = myReturn + ((myReturn == "" || myReturn == null) ? "" : "|") + path.TrimStart(new char[] { '\\' }) + saveFileName + saveFileExtension;
                    myReturn = path.TrimStart(new char[] { '\\' }) + "/" + saveFileName + saveFileExtension;
                }
            }
            catch
            {
                //异常
                //message("出现未知错误！");
                saveFileErrorMessage = "出现未知错误!";
                myReturn = null;
            }
            return myReturn;
        }

        #region getSaveFileFolderPath(...):获得保存的文件夹的物理路径
        /// <summary>
        /// 获得保存的文件夹的物理路径
        /// 返回保存的文件夹的物理路径,若为null则表示出错
        /// </summary>
        /// <param name="format">保存的文件夹路径 或者 格式化方式创建保存文件的文件夹，如按日期"yyyy"+"MM"+"dd":20060511</param>
        /// <returns>保存的文件夹的物理路径,若为null则表示出错</returns>
        private string getSaveFileFolderPath(string format)
        {
            string mySaveFolder = null;
            try
            {
                string folderPath = null;
                //以当前时间创建文件夹,
                //!!!!!!!!!!!!以后用正则表达式替换下面的验证语句!!!!!!!!!!!!!!!!!!!
                if (format.IndexOf("yyyy") > -1 || format.IndexOf("MM") > -1 || format.IndexOf("dd") > -1 || format.IndexOf("hh") > -1 || format.IndexOf("mm") > -1 || format.IndexOf("ss") > -1 || format.IndexOf("ff") > -1)
                {
                    //以通用标准时间创建文件夹的名字
                    folderPath = DateTime.UtcNow.ToString(format);
                    mySaveFolder = System.Web.HttpContext.Current.Server.MapPath(".") + @"" + folderPath + @"";
                }
                else
                {
                    mySaveFolder = System.Web.HttpContext.Current.Server.MapPath(".") + format;
                }
                System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(mySaveFolder);
                //判断文件夹否存在,不存在则创建
                if (!dir.Exists)
                {
                    dir.Create();
                }
            }
            catch
            {
                message("获取保存路径出错");
            }
            return mySaveFolder;
        }

        #endregion

        #region getFileExtension(...):获取原文件的扩展名
        /// <summary>
        /// 获取原文件的扩展名,返回原文件的扩展名(localFileExtension),该函数用到外部变量fileType,即允许的文件扩展名.
        /// </summary>
        /// <param name="myFileName">原文件名</param>
        /// <returns>原文件的扩展名(localFileExtension);若返回为null,表明文件无后缀名;若返回为"",则表明扩展名为非法.</returns>
        private string getFileExtension(string myFileName)
        {
            string myFileExtension = null;
            //获得文件扩展名
            myFileExtension = System.IO.Path.GetExtension(myFileName);//若为null,表明文件无后缀名;
            //分解允许上传文件的格式
            if (myFileExtension != "")
            {
                myFileExtension = myFileExtension.ToLower();//转化为小写
            }
            string[] temp = fileType.Split('|');
            //设置上传的文件是否是允许的格式
            bool flag = false;
            //判断上传的文件是否是允许的格式
            foreach (string data in temp)
            {
                if (("." + data) == myFileExtension)
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                myFileExtension = "";//不能设置成null,因为null表明文件无后缀名;
            }
            return myFileExtension;
        }
        #endregion

        #endregion

        #region message(...):弹出消息框
        /// <summary>
        /// 弹出消息框,显示内容(msg),点击"确定"后页面跳转到该路径(url)
        /// </summary>
        /// <param name="msg">显示内容</param>
        /// <param name="url">跳转路径</param>
        private void message(string msg, string url)
        {
            System.Web.HttpContext.Current.Response.Write("<script language=javascript>alert('" + msg + "');window.location='" + url + "'</script>");
        }

        /// <summary>
        /// 弹出消息框,显示内容(msg),无跳转
        /// </summary>
        /// <param name="msg">显示内容</param>
        private void message(string msg)
        {
            System.Web.HttpContext.Current.Response.Write("<script language=javascript>alert('" + msg + "');</script>");
        }
        #endregion
    }
}